package com.atguigu1.core.operator

import org.apache.spark.rdd.RDD
import org.apache.spark.{HashPartitioner, SparkConf, SparkContext}

/**
 *
 * @description: 相同的key对value进行聚合操作
 * @time: 2021-03-12 11:45
 * @author: baojinlong
 **/
object Spark19ReduceByKey {
  def main(args: Array[String]): Unit = {
    val conf: SparkConf = new SparkConf().setMaster("local[*]").setAppName("rdd")
    // 设置rdd分区数字
    val sparkContext = new SparkContext(conf)
    // 排序后分区数量不变 hash range分区 python分区是私有的
    val rddValue: RDD[(String, Int)] = sparkContext.makeRDD(Seq(("a", 1), ("b", 1), ("a", 2), ("b", 1), ("d", 1), ("a", 3)), 2)

    /**
     * reduceByKey:相同的key的数据进行value数据的聚合操作
     * scala语言中一般聚合操作都是两两聚合,spark基于scala开发,所以它的聚合也是两两聚合
     * 针对a的value 1,2,3
     * (1,2)=>3 (3,3)=>6
     * 如果key的数据只有一个,是不会参加运算的
     */
    val reduceByKeyResultRdd: RDD[(String, Int)] = rddValue.reduceByKey((x: Int, y: Int) => {
      println(s"x=$x y=$y")
      x + y
    })
    reduceByKeyResultRdd.collect.foreach(println)
    sparkContext.stop()
  }
}
